<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8">
    <title>Sucha's Blog - Archive for December, 2020</title>
    <meta name="generator" content="MarkdownProjectCompositor.lua">
    <meta name="author" content="Sucha">
    <meta name="keywords" content="suchang, programming, Linux, Lua">
    <meta name="description" content="Sucha's blog">
    <link rel="shortcut icon" href="../images/ico.png">
    <link rel="stylesheet" type="text/css" href="../styles/blog.css">
    <link rel="stylesheet" type="text/css" href="../styles/prism.min.css">
    <style id="site_theme"></style>
  </head>
  <body>
    <div id="body">
      <div id="text">
	   <!-- Page published by cmark-gfm begins here --><h1>Sucha's Blog ~ Archive for December, 2020</h1>
<p><a id="p0"></a></p>
<div class="date">20年12月13日 周四 22:38</div>
<h2>Swift(1)</h2>
<p>ObjC 我挺熟悉的，但切换到 Swift 的路并不顺利，虽然我之前写过一个结合 Swift + ObjC 运行时的换肤库 <a href="https://github.com/lalawue/LWTheme">LWTheme</a>，现在看来，确实是相当 ObjC 呀。</p>
<p>写了一点点商业 Swift 代码后，我现在还不能说我熟悉 Swift 了，Swift 内容太多了，特别是 Enum 以及带泛型的 Protocol，抽象能力太强了。</p>
<p>先开始吧。</p>
<h3>函数式书写静态类型推断</h3>
<p>纯 Swift 相比 ObjC，类型推断能力大大加强，算是一个静态语言，没有什么动态运行时，但 Target-Action 部分，在 Switch 里面，其实还是依赖 ObjC 运行时来跑的。</p>
<p>带 Optional 的静态推断，最大的好处，是类型安全，带 nil 的指针不会到处飞了。一眼开过去，Swift 的语法很像脚本语言，实际使用起来，也很函数式，很多时候，确实是用更少的代码粘合了更多的功能，带来的问题是能量压缩是想当大的。</p>
<p>反面的例子如下：</p>
<pre><code class="language-swift">let stringArray = [&quot;a&quot;, &quot;bb&quot;, &quot;cc&quot;]
let countsArray = stringArray.filter { $0.count &gt;= 2 }.map { $0.count }
print(countsArray)
</code></pre>
<p>输出是 [2,2]</p>
<p>假若 stringArray 带的是其他的类型，而在 countsArray 里面的 filter、map 操作有很多，那里面一长串的 $0 看的真的让人头大，因为实际的代码可不会像上面这样只有 2 行，也不会仅仅只有一种 transform，而是各种转换带下来，表达密度真的太大了。</p>
<h3>闭包及简写</h3>
<p>闭包相比 ObjC 容易写多了，但也有一些变种，比如上面 filter、map 的参数就是闭包，闭包只有一行的时候是可以省略 return 的，还有尾随闭包，比如上面的 filter 及 map，下面这个也是尾随闭包</p>
<pre><code class="language-swift">let seq = [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;].sorted { $0 &gt; $1 }
print(seq)
</code></pre>
<p>输出是 [&quot;C&quot;, &quot;B&quot;, &quot;A&quot;]</p>
<p>不得不说 Swift 的语法有点过于自由，这些隐含的缺省用法，看代码的时候得留意了。</p>
<h3>Enum 的相关值</h3>
<p>Swift 的 Enum 语法不仅仅是只有枚举，以及 raw value，还可以带相关值，提升为了一个带标记的容器，使得即便作为一种输入，其输入内容其实也是千变万化的，只是标记了一种路径输入而已，输入内容是带进来的，比如</p>
<pre><code class="language-swift">enum Goods {
    case name(String)
    case price(Int,Int) // 任性的将小数做为单独的 Int 带入
}
</code></pre>
<p>除了上面，常见的例子还有定义网络请求，将部分请求参数做为相关值带进来。</p>
<h3>结构体</h3>
<p>struct 相比 class，不能被继承，以及都是值传递而不是引用传递，这点让人不是那么满意，虽然写代码的时候往往不会注意到这点。</p>
<p>因为现实世界中的结构体其实可以很大的，有时候不是刚开始设计的问题，是后续的需求催大的。</p>
<h3>泛型</h3>
<p>有了严格的类型推导，泛型到处都可以存在，这种抽象容器能力，是 ObjC 所达不到的了。</p>
<h3>protocol 及 extension</h3>
<p>Swift 的 protocol 结合泛型，然后 extension 使用 protocol 将 class 能力大大扩大了，感觉就像是一种带入的计算属性一样，强。</p>
<p>现实中的 protocol 加上泛型，结合类实现，将类抽象为一个巨大的逻辑容器，代码真是让人看得头大，但另外一方面，不得不说如果是类似数据构建的页面，数据逻辑的抽象层让人放心了。</p>
<p>当然 UI 操作逻辑的抽象层也是可以做的。</p>
<h3>访问控制</h3>
<p>相比 ObjC 运行时的无所不能，Swift 带来了严格的访问控制，open、public、internal、fileprivate、private 应该有这五种吧，让 ObjC 转行过来的同学头都大了。</p>
<p>--</p>
<p>潦草的先这样吧。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2020-12.html#p0">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<!-- Page published by cmark-gfm ends here -->
  <div id="foot">2004-<script>var d = new
	Date();document.write(d.getFullYear())</script> &copy;
	Sucha. Powered by MarkdownProjectCompositor.
  </div>
  </div><!-- text -->
  <div id="sidebar">
  </div><!-- sidebar -->
  <script src="../js/prism.min.js" async="async"></script>
  <script src="../js/blog_sidebar.js"></script>
  </div> <!-- body -->
</body>
</html>